建立websocket
curl -X WS 'wss://HOST:PORT/api/v1/third_interface/new/chat?chai_id=聊天ID?key=秘钥&token=令牌/access_token'出于安全考虑,必须将 TOKEN 存储于服务端并通过后端接口调用,避免在前端代码中直接暴露,以防止凭证泄露造成损失
请在 Websocket 请求的 请求参数中携带 token,见Request Params:
TOKEN获取可通过 个人令牌 和 OAuth 应用获取,具体见 个人令牌授权,OAuth 授权码授权
应用秘钥private_key 的获取具体见 生成应用密钥
chat_id (str) 聊天ID (非必填) 在原有聊天基础上继续对话,可通过对话消息返回的 chat_id 获取key* (str)秘钥token* (str)令牌发送请求
直接发送 Json 字符串,格式如下
chatHistory (arr) 聊天历史列表 ,从获取历史消息接口中获取,需要过滤category为node的记录inputs(obj)
input(str) 用户问题file_list(array) 文件列表form(obj) 高级变量
高级变量名...{
"chatHistory":[
{
"is_bot": false,
"source": 0,
"message": {
"input": "李明今天赚了100元人民币",
"file_list": []
},
"extra": "\"{}\"",
"type": "human",
"category": "question",
"flow_id": "ac5da15cc68f4b289a1123b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eab",
"user_id": "3",
"liked": 0,
"solved": 0,
"sender": null,
"receiver": null,
"intermediate_steps": null,
"files": null,
"remark": null,
"create_time": "2024-08-27T14:01:16",
"update_time": null,
"user_question": null,
"knowledge_source": null,
"answer_files": null,
"id": null,
"isSend": true
},
{
"is_bot": true,
"source": 0,
"message": "李明今天赚了100元人民币。",
"extra": "\"{}\"",
"type": "end_cover",
"category": "answer",
"flow_id": "ac5da15cc68f4b289a1123b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eab",
"user_id": "3",
"liked": 0,
"solved": 0,
"sender": null,
"receiver": null,
"intermediate_steps": null,
"files": null,
"remark": null,
"create_time": "2024-08-27T14:01:16",
"update_time": null,
"user_question": null,
"knowledge_source": [],
"answer_files": [],
"id": "157c3a24049d47f2a51530de80af877e",
"isSend": false
}
],
"inputs": {
"input": "你好",
"file_list": [],
"form": {
"Input_1744788467616": "1",
"InputNumber_1744788460520": 3,
"Select_1744788459205": "选项1",
"Checkbox_1744788456599": [
"选项2",
"选项1"
],
"DatePicker_1744788455301": "2025-04-03",
"UploadFile_1744788453579": [
{
"file_path": "http://Host:PORT/api/v1/file/download?object_name=20250416a13adaaed549458cab4c98c341b35986.pdf",
"object_name": "20250416a13adaaed549458cab4c98c341b35986.pdf",
"file_name": "半云科技员工绩效考核管理办法.pdf",
"hash_code": "afe14fae2b9422afacd384da2091ea15"
}
]
}
}
}消息返回参数说明
| 返回参数key | 类型 | 含义 | |
|---|---|---|---|
| is_bot | bool | true是大模型回复,false是用户问题 | |
| message | str/ json | 返回的消息最终结果 | |
| type | str | begin/close 表示整轮会话的开始和结束,start/stream/end 表示stream的开始和结束 | |
| category | str | processing: 暂无特别实用 question/answer/report/system: 对应前端不同的展示样式 | |
| user_id | int | 当前用户id | |
| message_id | int | 消息id | |
| source | bool | 是否支持溯源, 0 不支持, 1 支持, 2有权限限制,3 问答库, 4 QA库 | |
| flow_id | str | 当前聊天的技能id | |
| chat_id | str | 当前会话id | |
| knowledge_source | json | 知识库来源列表 包含file_name和file_url | |
| answer_files | json | 结束节点文件输出列表 包含file_name和file_url | |
| is_microApp | json | 微应用数据(返回前端代码信息) |
当完整构建一条消息,至少需要后端给前端发送4条消息:
type=begin, category=system
type=start, category=system
type=end, message=""
type=close, category=system
开始处理对话的消息
表示已经接受到消息,准备开始执行
{
"is_bot": true,
"message": "",
"type": "begin",
"category": "system",
"user_id": 3,
"flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eac"
}接受节点运行状态的消息
该类型消息会成对发送,第一条 "type": "start"表示该节点开始运行, 第二条"type": "end",同时在message中携带该节点的运行时间,下列实例表示大模型节点执行过程,执行了0.12秒
{
"is_bot": true,
"message": {
"node_id": "BigModel-ab5e1",
"node_name": "大模型",
"input_str": {}
},
"type": "start",
"category": "node",
"user_id": 3,
"flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eac"
}{
"is_bot": true,
"message": {
"node_id": "BigModel-ab5e1",
"node_name": "大模型",
"output_str": "",
"cost_time": "0.12s"
},
"type": "end",
"category": "node",
"user_id": 3,
"flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eac"
}流式开始输出的消息
表示接下来准备输出流式消息
{
"is_bot": true,
"message": "",
"type": "start",
"category": "processing",
"user_id": 3,
"flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eac"
}流式输出消息
message为输出的片段
{
"is_bot": true,
"message": "你好",
"type": "stream",
"category": "processing",
"user_id": 3,
"flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eac"
}流式输出结束消息
{
"is_bot": true,
"message": "",
"type": "end",
"category": "processing",
"user_id": 3,
"flow_id": "f9688199-4d7c-47a8-b118-0110b3b32a6a",
"chat_id": "ed34c807e84f7d7d375a543c493a1b47"
}最终回答的消息
将流式输出拼接成完成的一段话,并且返回文件、知识库来源、微应用等信息
{
"is_bot": true,
"message": "你好!有什么我可以帮助你的吗?",
"type": "end_cover",
"category": "answer",
"user_id": 3,
"message_id": "580228c75f134cada43a625515529988",
"flow_id": "ac5da15c-c68f-4b28-9a11-23b2486c551f",
"chat_id": "5f85f74988e830aad4332b09d7f13eac",
"knowledge_source": [
{
"file_name": "日常用语.txt",
"file_url": "http://bywin-file/tmp-dir/mydocx.txt"
}
],
"answer_files": [
{
"file_url": "public-files/tmp_answer_files/cae48dcfa9b2a7e14fe4a2655c560b61/技能基本信息.docx",
"file_name": "技能基本信息.docx"
}
],
"is_microApp": {
"id": "MicroApp-b8378",
"pageList": [
{
"key": "0",
"code": "<!DOCTYPE html>前端代码</html>",
"label": "首页",
"pageId": "0"
},
{
"key": "1",
"code": "<!DOCTYPE html>前端代码</html>",
"label": "成功",
"pageId": "success"
}
]
}
}回答结束消息
表示该次回答结束
{
"is_bot": true,
"message": "",
"type": "close",
"category": "processing",
"user_id": 3,
"flow_id": "f9688199-4d7c-47a8-b118-0110b3b32a6a",
"chat_id": "ed34c807e84f7d7d375a543c493a1b47"
}api方式调用
Post请求 https://HOST:PORT/api/v1/flow/chat/api{
"chat_id":"222", #随机生成
"message":{"question":"hello","file_list":[]}, #question对应为用户问题 file_list默认为空即可
"api_key":"api_key", #扳手ai平台生成的key
"message_id":"2222222222222",#随机生成
"chat_history":[] #聊天历史示例见下文
}ResponseBody
event: message
data: {"is_bot": true, "message": "", "type": "start", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": " \u60a8", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u597d", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\uff01", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u5982\u679c\u60a8", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u6709\u4efb\u4f55", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u95ee\u9898", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u6216", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u9700\u8981", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u5e2e\u52a9", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\uff0c\u8bf7", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u968f\u65f6", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u544a\u8bc9\u6211", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u3002", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u6211", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u5728\u8fd9\u91cc", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u4e3a\u60a8\u63d0\u4f9b", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u652f\u6301", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "\u3002", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "", "type": "stream", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event: message
data: {"is_bot": true, "message": "", "type": "end", "category": "processing", "intermediate_steps": "", "files": [], "user_id": null, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "{}", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null}
event:message
data:{"is_bot": true, "message": " \u60a8\u597d\uff01\u5982\u679c\u60a8\u6709\u4efb\u4f55\u95ee\u9898\u6216\u9700\u8981\u5e2e\u52a9\uff0c\u8bf7\u968f\u65f6\u544a\u8bc9\u6211\u3002\u6211\u5728\u8fd9\u91cc\u4e3a\u60a8\u63d0\u4f9b\u652f\u6301\u3002", "type": "end_cover", "category": "answer", "intermediate_steps": null, "files": [], "user_id": 1, "message_id": null, "source": 0, "sender": null, "receiver": null, "liked": 0, "extra": "\"{}\"", "flow_id": "9edd6037882849b2bdb88b4799572a2d", "chat_id": "222555", "knowledge_source": null, "answer_files": null, "is_microApp": null} #全部回答
event: message
data:DONE参数说明
输出数据格式跟扳手平台模型配置有关 无论是否配置模型流式输出 结束消息之前都会返回最后一条消息
具体参数说明见上文